package com.jia.train.global.log.aspect;

import jakarta.servlet.http.HttpServletRequest;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import java.util.UUID;

@Aspect
@Component
public class LogAspect {

    private static Logger logger = LoggerFactory.getLogger(LogAspect.class);

    public LogAspect() {
        logger.info("Common LogAspect");
    }

    /**
     * 定义一个切点
     */
    @Pointcut("execution(public * com.jia..*Controller.*(..))")
    public void controllerPointcut() {

    }

//    /**
//     * 前置通知：在方法执行前记录请求信息
//     */
//    @Before("controllerPointcut()")
//    public void doBefore(JoinPoint joinPoint) {
//        // 获取当前请求
//        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
//        if (attributes == null) {
//            return;
//        }
//        HttpServletRequest request = attributes.getRequest();
//
//        // 生成唯一请求ID
//        String id = UUID.randomUUID().toString().replaceAll("-", "");
//
//        // 记录请求信息
//        logger.info("========================================== 开始请求 ==========================================");
//        logger.info("请求唯一标识: {}", id);
//        logger.info("请求URL: {}", request.getRequestURL().toString());
//        logger.info("请求方法: {}", request.getMethod());
//        logger.info("请求IP: {}", request.getRemoteAddr());
//        logger.info("请求类方法: {}.{}", joinPoint.getSignature().getDeclaringTypeName(), joinPoint.getSignature().getName());
//
//        // 打印请求参数
//        Object[] args = joinPoint.getArgs();
//        if (args != null && args.length > 0) {
//            logger.info("请求参数:");
//            for (int i = 0; i < args.length; i++) {
//                logger.info("参数{}: {}", i + 1, args[i]);
//            }
//        } else {
//            logger.info("无请求参数");
//        }
//    }
//
//    /**
//     * 环绕通知：记录方法执行时间和返回结果
//     */
//    @Around("controllerPointcut()")
//    public Object doAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
//        long startTime = System.currentTimeMillis();
//
//        // 执行目标方法
//        Object result = proceedingJoinPoint.proceed();
//
//        // 记录执行时间
//        long endTime = System.currentTimeMillis();
//        logger.info("方法执行时间: {}ms", endTime - startTime);
//
//        // 记录返回结果
//        logger.info("返回结果: {}", result);
//        logger.info("========================================== 结束请求 ==========================================\n");
//
//        return result;
//    }
//
//    /**
//     * 异常通知：记录方法执行异常
//     */
//    @AfterThrowing(pointcut = "controllerPointcut()", throwing = "e")
//    public void doAfterThrowing(Throwable e) {
//        logger.error("方法执行异常: ", e);
//        logger.info("========================================== 异常结束 ==========================================\n");
//    }

}



